import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCInsertDemo {
    public static void main(String[] args) throws SQLException {
        //使用JDBC往数据库里插入一条数据
        //需要提前准备好数据库(JDBC) 和 数据表(student)

//        1. 创建数据源 数据源描述了服务器在哪
        //向上转型(父类引用指向子类实例)
        //DataSource dataSource = new MysqlDataSource();
        //向下转型(父类引用转回子类实例)
        //设置数据库所在位置,当前是固定写法
        //((MysqlDataSource)dataSource).setUrl();
        //也可以以下操作,但是为了维护起来方便,内聚效果更好,还是建议使用上述实现方式
        /*
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setUrl();
        */
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/MyJDBC?charaterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
//      2. 建立数据库的网络连接
//      写JDBC代码本质上是实现一个MySQL客户端,要通过网络和服务器进行通信
        Connection connection = dataSource.getConnection();
        //通过控制台输入信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入ID:");
        int id = scanner.nextInt();
        System.out.println("请输入姓名:");
        String name = scanner.next();


//      3. 构造一个SQL语句 用来完成插入操作
    //String sql = "insert into Student values("+ id + ", '" + name + "')";
        String sql = "insert into Student values(?, ?)";
        PreparedStatement statement = connection.prepareStatement(sql); //PreparedStatement提供了替换操作
        //下标从1开始计算
        statement.setInt(1,id);//把id这个值以int的形式替换到1下标所指位置
        statement.setString(2,name);////把name这个值以String的形式替换到2下标所指位置
        System.out.println("SQL:"+statement);

        //String sql = "insert into Student values(2,'李四')";
        //JDBC中还需要搭配一个特定的对象来描述这里的sql情况
        //PreparedStatement statement = connection.prepareStatement(sql);
//      4. 执行SQL语句 控制客户端给服务器发送请求,返回结果是整数(影响了几行)
        //针对 增删改用 executeUpdate 来执行,针对查 用executeQuery来执行
        int ret = statement.executeUpdate();
        System.out.println("ret "+ ret);
//      5. 断开和数据库的连接并释放必要的资源
        statement.close();
        connection.close();
    }
}
